#include "stdafx.h"
#include "LuaContextManager.h"

namespace LuaDebug {

    LuaContext::LuaContextManager::LuaContextManager()
    {

    }

    LuaContext::LuaContextManager::~LuaContextManager()
    {

    }

    bool LuaContext::LuaContextManager::IsEmpty()
    {
        scoped_lock lock(m_mutex);

        return m_map.empty();
    }

    void LuaContext::LuaContextManager::Add(LuaContext_ptr ctx, lua_State *L)
    {
        scoped_lock lock(m_mutex);

        if (ctx == NULL || L == NULL) {
            return;
        }

        m_map.insert(std::make_pair(L, ctx));
    }

    void LuaContext::LuaContextManager::Erase(LuaContext_ptr ctx)
    {
        scoped_lock lock(m_mutex);

        if (ctx == NULL) {
            return;
        }

        for (Map::iterator it = m_map.begin(); it != m_map.end(); ) {
            LuaContext_ptr p = (*it).second;

            if (p == ctx) {
                m_map.erase(it++);
            }
            else {
                ++it;
            }
        }
    }

    LuaContext_ptr
        LuaContext::LuaContextManager::Find(lua_State *L)
    {
        scoped_lock lock(m_mutex);

        if (L == NULL) {
            return LuaContext_ptr();
        }

        Map::iterator it = m_map.find(L);
        if (it == m_map.end()) {
            return LuaContext_ptr();
        }

        return (*it).second;
    }

} // namespace LuaDebug
